import streamlit as st
import matplotlib.pyplot as plt
import pandas as pd

# 提供的数据
all_data = {
    'other': 4264,
    'A220': 3730,
    'Boeing787': 2645,
    'Boeing737': 2557,
    'A320/321': 1771,
    'ARJ21': 1187,
    'A330': 309
}

# 将字典转换为pandas Series
class_counts_series = pd.Series(all_data)

def main():
    st.title("高分辨率SAR飞机检测识别")
    
    st.markdown("""
    ### 项目背景

    基于SAR图像的飞机检测识别能获取飞机目标的型号、种类、位置、状态等信息，可有效辅助重点区域动态监视、态势分析、紧急救援等应用。因此，利用高分辨率SAR图像对飞机目标进行检测识别具有重要的研究意义。

    #### 高分辨率SAR图像的特点
    - **分辨率高、尺寸大**
    - **图像中飞机散射点离散** 飞机目标尺寸较小，特征不容易提取，散射点之间较为离散，准确定位和识别的难度较大。
    - **背景强干扰，会造成虚警** 目标容易受到航站楼和停机坪等周围背景的干扰，使得具有相似散射视觉属性的物体被识别为飞机目标，导致出现虚警和漏警的现象。
    - **类内差异大** 在不同的成像角度下，同一目标会呈现出不同的视觉特征，类内差异大，增加了飞机识别的难度。

    #### 数据集
    - 数据集中所有图像采集自高分三号卫星，极化方式为单极化，空间分辨率为1m，成像模式为聚束式。
    - 数据集主要选用上海虹桥机场、北京首都机场、台湾桃园机场3个民用机场的影像数据，包含800×800, 1000×1000, 1200×1200和1500×1500共4种不同尺寸，共有4,368张图片和16,463个飞机目标实例。
    - 飞机的具体类别包含了A220, A320/321, A330, ARJ21, Boeing737, Boeing787, other，各个类别的实例以及数量，其中other表示不属于其余6个类别的飞机实例。数据集分布如下图：
    """)

    # 提供的数据
    data = {
        'other': 4264,
        'A220': 3730,
        'Boeing787': 2645,
        'Boeing737': 2557,
        'A320/321': 1771,
        'ARJ21': 1187,
        'A330': 309
    }

    # 将字典转换为pandas Series
    class_counts_series = pd.Series(all_data)

    # 绘制条形图
    fig, ax = plt.subplots(figsize=(10, 6))
    class_counts_series.plot(kind='bar', ax=ax)
    plt.xlabel('Class')  # 设置x轴标签
    plt.ylabel('Count')  # 设置y轴标签
    plt.title('Distribution of Classes')  # 设置图表标题

    # 在每个条形的顶部显示数值
    for p in ax.patches:
        ax.annotate(str(p.get_height()), (p.get_x() + p.get_width() / 2., p.get_height()),
                    ha='center', va='bottom',
                    xytext=(0, 5),  # 5 points vertical offset
                    textcoords='offset points')

    # 使用streamlit显示matplotlib图形
    st.pyplot(fig)

    st.markdown("""
    #### 训练模型
    - **YOLOv11n**
    - **YOLOv11s**
    - **YOLOv11m**
    - **YOLOv11l**
    - **YOLOv11x**

    #### 训练方案一
    1. **数据集**
        - 1.1 数据分析
        - 1.2 划分训练集和验证集
    2. **模型训练**
        - 2.1 模型选择
        - 2.2 模型参数设置
        - 2.3 模型训练
    3. **模型评估**
        - 3.1 模型评估指标

    #### 训练方案二
    1. **数据集**
        - 1.1 数据分析
        - 1.2.1 划分训练集和验证集（只训练A330分类）
        - 1.2.2 划分训练集和验证集（追加A320/321、A220分类）
        - 1.2.3 划分训练集和验证集（追加ARJ21、Boeing737、Boeing787和other分类）
    2. **模型训练**
        - 2.1 模型选择
        - 2.2 模型参数设置
        - 2.3.1 模型训练（只训练A330分类，训练100轮）
        - 2.3.2 模型训练（追加A320/321、A220分类，训练100轮）
        - 2.3.3 模型训练（追加ARJ21、Boeing737、Boeing787和other分类，训练100轮）
    3. **模型评估**
        - 3.1 模型评估指标

    #### 训练方案三（优化）
    1. **数据集**
        - 1.1 采集数据
        - 1.2 数据增强\\数据裁剪（减少样本数量）
        - 1.3 划分训练集和验证集
    2. **模型训练**
        - 2.1 模型选择
        - 2.2 模型参数设置
        - 2.3 模型训练
    3. **模型评估**
        - 3.1 模型评估指标

    #### 训练过程的对比
    - 对比不同训练过程的效果和性能，参见性能评估页面。

    #### 结论
    - **YOLO 杯型越大，效果越好**
    - **YOLO 杯型越大，用时越长**
    - **样本少准确率会偏低，尝试对样本少的类别进行增强**
    - **手动添加样本的结果没有直接全量结果好，没有控制好量（负样本数量大也影响提高准确率），过拟合了，训练出来的模型就废了**
    - **训练轮次需要对比寻找最优值**

    """)

if __name__ == "__main__":
    main()